# JZ11 二进制中1的个数
#
# 描述
# 输入一个整数，输出该数32位二进制表示中1的个数。其中负数用补码表示。
# 示例1
# 输入：
# 10
# 返回值：
# 2

# 核心代码模式
# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # 法一 检查二进制每一位数字 移位操作
        # 每次将第i位元素移动到末尾 跟1相与操作 计数
        res = 0
        for i in range(0, 32):
            res += n >> i & 1
        return res

        # 法二 位运算 n&(n-1) 可以使最右边的1变0
        # 循环变了多少次就多少个1
        ress = 0
        # python 中的数字没有位数限制，需要将位数限制在32位，
        # 通过和一个32位的全1数字按位与运算即可。（正数无需这么操作）
        if n < 0: n &= 0xffffffff
        while n:
            n &= (n - 1)
            ress += 1
        return res
